//package com.itheima.wechat;
//
//import java.util.Date;
//import java.util.HashMap;
//import java.util.Map;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//
//@Slf4j
//@RestController
//@RequestMapping("/wc")
//public class WeChatLoginController {
//    // 模拟存放(实际开发中应该存放在数据库和Redis)
//    private static Map<String, String> mapData = new HashMap<>();
//    // appId\appSecret redirectUri 实际生产中应该配置到数据库
//    private static String appId = "wjy155133096495";
//    private static String appSecret = "e7aeb6cb4be6fe3388cfd4580f36";
//    // 微信授权code后的回调地址
//    private static String redirectUri = "http://lidongping.free.idcfengye.com";
//
///**
//     * 请求CODE*/
//
//
//    @GetMapping("/codeUrl")
//    public BaseResponse getCodeUrl() {
//        String url = "https://open.weixin.qq.com/connect/qrconnect?appid=%s&redirect_uri=%s&response_type=code&scope=SCOPE&state=STATE#wechat_redirec";
//        url = String.format(url, appId, redirectUri);
//        return ResponseBuilder.success(url);
//    }
//
///*
//*
//     * 第二步：通过code换取网页授权access_token
//     * code=011NQuFa1OiTgA0spVGa1Cvyff1NQuFC&state=STATE
//     * <p>
//     * {
//     * "access_token":"ACCESS_TOKEN",
//     * "expires_in":7200,
//     * "refresh_token":"REFRESH_TOKEN",
//     * "openid":"OPENID",
//     * "scope":"SCOPE"
//     * }
//*/
//
//
//    @GetMapping("/notify/code")
//    public BaseResponse notifyCode(String code, String state) {
//        log.info("code={},state={}", code, state);
//        if (StrUtil.isEmpty(code)) {
//            return ResponseBuilder.failed("获取code失败");
//        }
//        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";
//        url = String.format(url, appId, appSecret, code);
//        log.info("第二步：通过code换取网页授权access_token,请求url={}", url);
//        String response = HttpUtil.get(url, 60000);
//        log.info("响应结果:{}", response);
//
//        // 模拟数据入库,便于下次使用
//        JSONObject object = JSON.parseObject(response);
//        String openId = object.getString("openid");
//        // 设置token失效时间
//        Long timeOutAccessToken = DateUtil.offset(new Date(), DateField.SECOND, object.getInteger("expires_in") - 120).getTime();
//        object.put("timeOutAccessToken", timeOutAccessToken);
//        // refresh_token有效期为30天
//        object.put("timeOutRefreshToken", DateUtil.offsetDay(new Date(), 30));
//        mapData.put(openId, JSON.toJSONString(object));
//
//        // 将openid返回给调用者便于,下次使用openid获取用户信息
//        return ResponseBuilder.success(openId);
//    }
//
//*
//     * 拉取用户信息(需scope为 snsapi_userinfo)
//
//
//    @GetMapping("/userInfo")
//    public BaseResponse userInfo(String openId) {
//        String obj = mapData.get(openId);
//        if (obj == null) {
//            return ResponseBuilder.failed("未授权");
//        }
//        JSONObject object = JSON.parseObject(obj);
//        String accessToken = object.getString("access_token");
//        Long timeOutAccessToken = object.getLong("timeOutAccessToken");
//        if (timeOutAccessToken < System.currentTimeMillis()) {
//            // 重新获取 access_token
//            accessToken = refreshToken(openId);
//        }
//        String url = "https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN";
//        url = String.format(url, accessToken, openId);
//
//        log.info("拉取用户信息 请求url={}", url);
//        String response = HttpUtil.get(url, 60000);
//        log.info("响应结果:{}", response);
//        return ResponseBuilder.success(response);
//    }
//
//*
//     * 刷新access_token（如果需要）
//     * <p>
//     * {
//     * "access_token":"ACCESS_TOKEN",
//     * "expires_in":7200,
//     * "refresh_token":"REFRESH_TOKEN",
//     * "openid":"OPENID",
//     * "scope":"SCOPE"
//     * }
//     *
//     * @return
//
//
//    public String refreshToken(String openId) {
//        String obj = mapData.get(openId);
//        if (obj == null) {
//            throw new ParamException("用户没有授权");
//        }
//        JSONObject objectMap = JSON.parseObject(obj);
//        Long timeOutAccessTokenOld = objectMap.getLong("timeOutRefreshToken");
//        // 判定refresh_token是否过期
//        if (timeOutAccessTokenOld < System.currentTimeMillis()) {
//            throw new ParamException("授权已过期,请重新授权");
//        }
//        String refreshToken = objectMap.getString("refresh_token");
//        String url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=%s&grant_type=refresh_token&refresh_token=%s";
//        url = String.format(url, appId, refreshToken);
//        log.info("拉取用户信息 请求url={}", url);
//        String response = HttpUtil.get(url, 60000);
//        log.info("响应结果:{}", response);
//
//        // 模拟数据入库,便于下次使用
//        JSONObject object = JSON.parseObject(response);
//        // 设置token失效时间
//        Long timeOutAccessToken = DateUtil.offset(new Date(), DateField.SECOND, object.getInteger("expires_in") - 120).getTime();
//        object.put("timeOutAccessToken", timeOutAccessToken);
//        // refresh_token有效期为30天
//        object.put("timeOutRefreshToken", DateUtil.offsetDay(new Date(), 30));
//        mapData.put(openId, JSON.toJSONString(object));
//
//        return object.getString("access_token");
//    }
//
//}
